/*
 * ArchivoFrontCoding.h
 *
 *  Created on: 02/06/2013
 *      Author: jonathan
 */

#ifndef ARCHIVOFRONTCODING_H_
#define ARCHIVOFRONTCODING_H_
#include "../../typedefs.hpp"
#include "ArchivoPunteros.h"
#include <fstream>
#include <list>
#include <string>
#include <map>
#include "../../commons/bitstream.h"
#include "../../general/estructuras/Termino.h"
#include "../estructuras/EntradaIndice.h"
#include "../../commons/Compresor.h"
using namespace std;

class ArchivoFrontCoding {
private:
	string ultimoTermino;
	ArchivoPunteros * archPtros;
	BitStream  bs;
	EnteroLargo contador;
	EnteroLargo tamanioBloque;
	EnteroLargo resetFrontCoding();
	EntradaIndice * escribirFrontCoding(string termino);
	void escribirCadena(string cadena);
	Compresor *compresor;
	string leerCaracteres(int cantCaracteres);
	//lee el siguiente termino.
	Termino * proximoTermino(EntradaIndice & entrada);
public:
	ArchivoFrontCoding(FileName, FileName, EnteroLargo, fstream::openmode);
	ArchivoFrontCoding(fstream::openmode);
	EntradaIndice * escribir(Termino &);
	//NO VAMOS A IR A BUSCAR UN TERMINO, SIEMPRE VAMOS A QUERER RETORNAR UNA CABECERA DE BLOQUE.
	Termino * leerCabecera(EntradaIndice &entrada);

	//Le das la lista de entradas, la primera posicion tiene q tener la entrada con el ptro a lexico.
	map<string, Termino*> * leerBloque(list<EntradaIndice>&);


	void close();
	virtual ~ArchivoFrontCoding();
};

#endif /* ARCHIVOFRONTCODING_H_ */
